const fp = require('lodash/fp')
// const cars = [
// 	{ name: 'Ferrari FF', horsepower: 660, dollar_value: 700000, in_stock: true },
// 	{ name: 'Spyker C12 Zagato', horsepower: 650, dollar_value: 648000, in_stock: false },
// 	{ name: 'Jaguar XKR-S', horsepower: 550, dollar_value: 132000, in_stock: false },
// 	{ name: 'Audi R8', horsepower: 525, dollar_value: 114200, in_stock: false },
// 	{ name: 'Aston Martin One-77', horsepower: 750, dollar_value: 1850000, in_stock: true },
// 	{ name: 'Pagani Huayra', horsepower: 700, dollar_value: 1300000, in_stock: false }
// ]

// // 练习1
// let isLastInStock = fp.flowRight(fp.prop('in_stock'), fp.last)
// // 练习2
// let getFirstName = fp.flowRight(fp.prop('name'), fp.first)
// // 练习3
// let _average = (xs) => fp.reduce(fp.add, 0, xs) / xs.length
// let dollar_value = fp.flowRight(_average, fp.map((car) => car.dollar_value))
// // 练习4
// let _underscore = fp.replace(/\W+/g, '_')
// let sanitizeNames = fp.map(fp.flowRight(fp.toLower,_underscore))
// console.log(sanitizeNames(['Hello World']))

const { Container, MayBe } = require('./functors')
// 练习1
let maybe = MayBe.of([ 5, 6, 1 ])
let ex1 = fp.map(fp.add(1))
console.log(maybe.map(ex1))
// 练习2
let xs = Container.of([ 'do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do' ])
let ex2 = fp.first
console.log(xs.map(ex2))
// 练习3
let user = { id: 2, name: 'Albert' }
let safeProp = fp.curry(function(x, o) {
	return MayBe.of(o[x])
})
let first = (functor) => functor.map(fp.first)
let ex3 = fp.flowRight(first, safeProp('name'))
console.log(ex3(user))
// 练习4
let ex4 = (n) => MayBe.of(n).map(parseInt)
console.log(ex4(null))
